const deepClone = (obj, hash = new WeakMap()) => {
  // 处理非对象或null的情况
  if (obj == null || typeof obj !== "object") {
    return obj;
  }

  // 如果已经处理过这个对象，则直接返回结果
  if (hash.has(obj)) {
    return hash.get(obj);
  }

  let newObj;
  let constructor = obj.constructor;

  // 根据constructor处理特殊对象
  if (Array.isArray(obj)) {
    newObj = [];
  } else if (obj instanceof Date) {
    newObj = new Date(obj);
  } else if (obj instanceof RegExp) {
    newObj = new RegExp(obj.source, obj.flags);
  } else if (obj instanceof Function) {
    // 注意：函数通常不可深拷贝，这里只返回引用
    return obj;
  } else if (obj instanceof Set) {
    newObj = new Set();
    obj.forEach(item => {
      newObj.add(deepClone(item, hash));
    });
  } else if (obj instanceof Map) {
    newObj = new Map();
    obj.forEach((value, key) => {
      newObj.set(deepClone(key, hash), deepClone(value, hash));
    });
  } else if (obj instanceof WeakMap || obj instanceof WeakSet) {
    // WeakMap和WeakSet不能直接深拷贝，因为它们持有弱引用
    // 这里可以返回一个新的WeakMap或WeakSet实例，但它是空的
    // 或者抛出一个错误表示无法深拷贝
    throw new Error("WeakMap/WeakSet cannot be cloned");
  } else {
    // 处理普通对象
    newObj = new constructor();
  }

  // 将当前对象添加到hash中，避免循环引用
  hash.set(obj, newObj);

  // 递归处理对象的属性
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepClone(obj[key], hash);
    }
  }

  // 处理Symbol类型的键
  Object.getOwnPropertySymbols(obj).forEach(sym => {
    if (obj.propertyIsEnumerable(sym)) {
      newObj[sym] = deepClone(obj[sym], hash);
    }
  });

  return newObj;
};

export default deepClone;
